package gov.mogaha.ntis.cmm.mob.util;

import gov.mogaha.ntis.cmm.mob.R;

import java.util.Calendar;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import android.app.DatePickerDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.TextView;


/**
 *  Class Name : DatePickDialog.java
 *  Description : 날짜를 선택할 수 있는 다이얼로그를 호출하는 클래스
 * 
 *   수정일			수정자		수정내용
 *   -----------	---------	---------------------------
 *   2011.08.16	이전봉		최초 생성
 *   2011.08.31	이전봉		parseDate(String date)메소드 추가
 *   2011.09.01	이전봉		날짜 저장 전역변수 추가, getDate() 메소드 수정
 *   2011.10.12	함태영		다이얼로그에 '삭제'버튼 추가
 *   2011.10.14	이전봉		이전 날짜값이 텍스트필드에 있는 경우 해당 날짜로 다이얼로그값 자동 세팅
 *
 *  @author 이전봉
 *  @since 2011. 08. 16
 *  @version 1.4
 * 
 *  Copyright (C) 2011 by MOPAS All right reserved.
 */
public class DatePickDialog {
	private final Context context;
	private final Calendar calendar;
	
	private final DatePickerDialog.OnDateSetListener datePicker = new DatePickerDialog.OnDateSetListener() {
		@Override
		public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
			String y, m, d;
			
			y = year+"";
			m = monthOfYear+1+"";
			d = dayOfMonth+"";
			
			//년도가 항상 4자리가 되도록 세팅
			if(y.length() < 4){
				y = "0"+y;
			}else if(y.length() < 3){
				y = "00"+y;
			}else if(y.length() < 2){
				y = "000"+y;
			}else if(y.length() == 0){
				y = "0000"+y;
			}
			
			//월이 항상 2자리가 되도록 세팅
			if(m.length() < 2){
				m = "0"+m;
			}else if(m.length() == 0){
				m = "00"+m;
			}
			
			//일이 항상 2자리가 되도록 세팅
			if(d.length() < 2){
				d = "0"+d;
			}else if(d.length() == 0){
				d = "00"+d;
			}
			
			//날짜 저장 변수에 저장
			selectedDateStr = y+"."+m+"."+d;
			
			
			if (textSet) {
				if(textView != null)
					textView.setText(y+"-"+m+"-"+d);
				if(textField != null)
					textField.setText(y+"-"+m+"-"+d);
			}
		}
	};
	
	private boolean textSet = false;
	private EditText textField;
	private TextView textView;
	
	/**선택된 날짜를 저장하는 변수*/
	private String selectedDateStr = "";
	
	
	
	/**<B><I>public DatePickDialog(Context context, Calendar calendar)</B></I><BR>
	 * 날짜를 선택할 수 있는 다이얼로그를 생성함. 생성시 매개변수로 지정하는 Calendar 개체로 
	 * 선택된 날짜가 저장된다. 생성 후 show() 메소드를 사용해서 호출함.
	 * @param context Context
	 * @param calendar 날짜를 저장할 Calendar 클래스
	 * @author 이전봉
	 */
	public DatePickDialog(Context context, Calendar calendar) {
		this.context = context;
		this.calendar = calendar;
	}
	
	/**<B><I>public DatePickDialog(Context context, Calendar calendar, EditText textField)</B></I><BR>
	 * 날짜를 선택할 수 있는 다이얼로그를 생성함.
	 * @param context Context
	 * @param calendar 날짜를 저장할 Calendar 클래스
	 * @param textField 다이얼로그가 닫힐 때 선택된 날짜를 입력할 EditText
	 * @author 이전봉
	 */
	public DatePickDialog(Context context, Calendar calendar, EditText textField) {
		this.context = context;
		this.calendar = calendar;
		this.textField = textField;
		textSet = true;
	}

	
	public DatePickDialog(Context context, Calendar calendar, TextView textView) {
		this.context = context;
		this.calendar = calendar;
		this.textView = textView;
		textSet = true;
	}
	
	
	
	/**<B><I>public {@link DatePickerDialog} getDatePickerDlg()</B></I><BR>
	 * 새로운 날짜선택 다이얼로그를 생성한다. 
	 * 다이얼로그 인터페이스({@link DialogInterface.OnDismissListener}) 등을 
	 * 직접 재정의 할 때 유용하다.<P>
	 * 기존 텍스트 필드에 적절한 날짜값, 예를들어 'yyyy-mm-dd'와 같은 형식의 문자열이 있을 경우 
	 * 다이얼로그를 자동으로 해당 날짜값으로 설정한다. 
	 * 생성된 개체의 <B>updateDate(year, monthOfYear, dayOfMonth)</B> 메소드를 사용하면 
	 * 직접 다이얼로그의 날짜값을 설정해 줄 수 있다.
	 * @return 새로 생성한 날짜 선택 다이얼로그 개체
	 * @see <LI>{@link android.app.Dialog}</LI>
	 * @see <LI>{@link android.app.DatePickerDialog}</LI>
	 * @see <LI>{@link DialogInterface}</LI>
	 */
	public DatePickerDialog getDatePickerDlg() {
		DatePickerDialog dlg = new DatePickerDialog(context, datePicker,
				calendar.get(Calendar.YEAR),
				calendar.get(Calendar.MONTH),
				calendar.get(Calendar.DAY_OF_MONTH));
		
		//기존 날짜값이 있는지 확인한다
		int year = 0;
		int monthOfYear = 0;
		int dayOfMonth = 0;
		
		if (textView!=null || textField!=null) {
			String[] exDatas = null;
			if (textView != null) exDatas = textView.getText().toString().split("-");
			if (textField != null) exDatas = textField.getText().toString().split("-");
			
			if (exDatas.length == 3) {
				year = Integer.parseInt(exDatas[0]);
				monthOfYear = Integer.parseInt(exDatas[1])-1;
				dayOfMonth = Integer.parseInt(exDatas[2]);
				calendar.set(year, monthOfYear, dayOfMonth);
				dlg.updateDate(year, monthOfYear, dayOfMonth);
				
			}
			
//			else {
//				year = calendar.get(Calendar.YEAR);
//				monthOfYear = calendar.get(Calendar.MONTH);
//				dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH);
//			}
		}
		
		return dlg;
	}
	
	
	/**<B><I>public DatePickerDialog getYearOnlyDatePickerDlg()</B></I><BR>
	 * 연도만 지정되는 다이얼로그를 호출한다.
	 * @return 날짜선택 다이얼로그
	 * @author 이전봉
	 */
	public DatePickerDialog getYearOnlyDatePickerDlg() {
		DatePickerDialog.OnDateSetListener yearPicker = new DatePickerDialog.OnDateSetListener() {
			@Override
			public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
				String y = year+"";
				
				//년도가 항상 4자리가 되도록 세팅
				if(y.length() < 4){
					y = "0"+y;
				}else if(y.length() < 3){
					y = "00"+y;
				}else if(y.length() < 2){
					y = "000"+y;
				}else if(y.length() == 0){
					y = "0000"+y;
				}
				
				if (textSet) {
					if(textView != null)
						textView.setText(y);
					if(textField != null)
						textField.setText(y);
				}
			}
		};
		
		
		DatePickerDialog dlg = new DatePickerDialog(context, yearPicker,
				calendar.get(Calendar.YEAR),
				calendar.get(Calendar.MONTH),
				calendar.get(Calendar.DAY_OF_MONTH));
		
		//기존 날짜값이 있는지 확인한다
		int year = 0;
		int monthOfYear = Calendar.MONTH - 1;
		int dayOfMonth = Calendar.DAY_OF_MONTH;
		
		if (textView!=null || textField!=null) {
			String exDatas = "";
			if (textView != null) exDatas = textView.getText().toString();
			if (textField != null) exDatas = textField.getText().toString();
			
			if (!exDatas.equals("")) {
				year = Integer.parseInt(exDatas);
				calendar.set(year, monthOfYear, dayOfMonth);
				dlg.updateDate(year, monthOfYear, dayOfMonth);
			}
		}
		
		return dlg;
	}
	
	
	
	/**<B><I>public void showYearOnlyDlg()</B></I><BR>
	 * 연도만 선택하는 날짜선택 다이얼로그를 호출한다.
	 */
	public void showYearOnlyDlg() {
		DatePickerDialog dlg = getYearOnlyDatePickerDlg();
		
		dlg.setOnCancelListener(new DialogInterface.OnCancelListener() {
			@Override
			public void onCancel(DialogInterface dialog) {
				return;
			}
		});
		
		dlg.setButton3(context.getString(R.string.messagebox_del), new DialogInterface.OnClickListener() {
			@Override
			public void onClick(DialogInterface dialog, int which) {
				if (textSet) {
					if(textView != null)
						textView.setText("");
					if(textField != null)
						textField.setText("");
				}
			}
		});
		
		dlg.show();
	}
	
	
	
	/**<B><I>public void show()</B></I><BR>
	 * 생성된 날짜선택 다이얼로그를 호출함. getDatePickerDlg() 메소드는 호출할 필요 없음.
	 */
	public void show() {
		DatePickerDialog dlg = getDatePickerDlg();
		
		dlg.setOnCancelListener(new DialogInterface.OnCancelListener() {
			@Override
			public void onCancel(DialogInterface dialog) {
				return;
			}
		});
		
		dlg.setButton3(context.getString(R.string.messagebox_del), new DialogInterface.OnClickListener() {
			@Override
			public void onClick(DialogInterface dialog, int which) {
				if (textSet) {
					if(textView != null)
						textView.setText("");
					if(textField != null)
						textField.setText("");
				}
			}
		});
		
		
//		dlg.setOnDismissListener(new DialogInterface.OnDismissListener() {
//			@Override
//			public void onDismiss(DialogInterface dialog) {
//				if (textSet) {
//					int year = calendar.get(Calendar.YEAR);
//					int month = calendar.get(Calendar.MONTH);
//						if (month < 1) month = 12;
//					int day = calendar.get(Calendar.DAY_OF_MONTH);
//					
//					textField.setText(year+"년 "
//							+month+"월 "
//							+day+"일");
//				}
//			}
//		});
		
		dlg.show();
	}
	

	
	
	/**<B><I>public String getDate()</B></I><BR>
	 * 날짜선택 다이얼로그에서 선택된 날짜를 문자열 형태로 받아온다.<BR>
	 * 문자열은 '2011.8.30'과 같은 형식이므로 String.split(".") 메소드를 사용하면 간편히 날짜를 년월일로 나눌 수 있음. 
	 * 날짜선택 다이얼로그를 호출하지 않은 상태에서 이 메소드를 호출하면 오늘의 날짜가 리턴됨.
	 * @return 콤마('.')로 구분된 yyyy/m/dd 형식의 날짜 - 예) 2011.8.30
	 */
	public String getDate() {
		return selectedDateStr;
	}
	
	
	
	/**<B><I>public String parseDate(String date)</B></I><BR>
	 * '2011년 8월 30일'과 같은 날짜 형식을 대시('-')로 구분된 문자열로 변환. 예)2011-08-30
	 * @param date 변환할 날짜형식의 문자열
	 * @return 띄어쓰기로 구분된 문자열
	 */
	public String parseDate(String date) {
		StringBuilder builder = new StringBuilder("");
		Pattern ptn;
		Matcher matcher;
		
		String nums[] = date.split(" ");
		
		for (int i=0; i<nums.length; i++) {
			String data = nums[i];
			
			switch (i) {
			case 0 :
				ptn = Pattern.compile("([0-9]*)년");
				matcher = ptn.matcher(data);
				if (matcher.find()) builder.append(matcher.group(1));
				break;
				
			case 1 :
				ptn = Pattern.compile("([0-9]*)월");
				matcher = ptn.matcher(data);
				if (matcher.find()) {
					String str = matcher.group(1);
					if (str.length() == 1)
						builder.append("-0"+str);
					else if (str.length() == 2)
						builder.append("-"+str);
				}
				break;
				
			case 2 :
				ptn = Pattern.compile("([0-9]*)일");
				matcher = ptn.matcher(data);
				if (matcher.find()) {
					String str = matcher.group(1);
					if (str.length() == 1)
						builder.append("-0"+str);
					else if (str.length() == 2)
						builder.append("-"+str);
				}
			default:
				break;
			}
		}
		
		return builder.toString();
	}
}













